package ar.com.aterrizar.test.filtros;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import ar.com.aterrizar.asientos.Asiento;
import ar.com.aterrizar.asientos.AsientoLanchita;
import ar.com.aterrizar.entidades.Categoria;
import ar.com.aterrizar.entidades.Cliente;
import ar.com.aterrizar.entidades.TipoDeClaseAsiento;
import ar.com.aterrizar.entidades.TipoDeUbicacionAsiento;
import ar.com.aterrizar.filtrosBusqueda.FiltroObligatorio;
import ar.com.aterrizar.filtrosBusqueda.FiltroOpcional;
import ar.com.aterrizar.filtrosBusqueda.FiltroPorAsientosReservados;
import ar.com.aterrizar.filtrosBusqueda.FiltroPorClase;
import ar.com.aterrizar.filtrosBusqueda.FiltroPorPrecio;
import ar.com.aterrizar.filtrosBusqueda.FiltroPorUbicacion;

import com.google.common.collect.Iterables;

public class FiltrosOpcionalesLanchita {

	private List<Asiento> asientos = new ArrayList<Asiento>();
	Cliente cliente = new Cliente("Raul", "Fernandez", 15786664, Categoria.STANDARD, false);
	
	public FiltrosOpcionalesLanchita(){
		//Se crea todo la lista que sera filtrada multiples veces por cada test
		this.asientos.add(new AsientoLanchita("001-1", (float) 1000, TipoDeClaseAsiento.TURISTA, TipoDeUbicacionAsiento.PASILLO, true, "09/10/2012 09:00", "10/10/2012 10:00" , "EZE", "USA"));
		this.asientos.add(new AsientoLanchita("001-2", (float) 1000, TipoDeClaseAsiento.TURISTA, TipoDeUbicacionAsiento.VENTANA, true, "10/10/2012 09:00", "11/10/2012 10:00" , "EZE", "USA"));
		this.asientos.add(new AsientoLanchita("001-3", (float) 2000, TipoDeClaseAsiento.EJECUTIVA, TipoDeUbicacionAsiento.PASILLO, false, "10/10/2012 09:00", "10/10/2012 10:00" , "EZE", "USA"));
		this.asientos.add(new AsientoLanchita("001-4", (float) 2000, TipoDeClaseAsiento.EJECUTIVA, TipoDeUbicacionAsiento.VENTANA, false, "11/10/2012 09:00", "11/10/2012 10:00" , "EZE", "USA"));
		this.asientos.add(new AsientoLanchita("002-5", (float) 3000, TipoDeClaseAsiento.PRIMERACLASE, TipoDeUbicacionAsiento.CENTRO, false, "10/10/2012 09:00", "11/10/2012 10:00" , "PAR", "USA"));
		this.asientos.add(new AsientoLanchita("002-6", (float) 3000, TipoDeClaseAsiento.TURISTA, TipoDeUbicacionAsiento.PASILLO, false, "10/10/2012 09:00", "11/10/2012 10:00" , "ESP", "USA"));
		this.asientos.add(new AsientoLanchita("002-7", (float) 4000, TipoDeClaseAsiento.PRIMERACLASE, TipoDeUbicacionAsiento.PASILLO, false, "10/10/2012 09:00", "11/10/2012 10:00" , "ESP", "USA"));
		this.asientos.add(new AsientoLanchita("002-8", (float) 4000, TipoDeClaseAsiento.TURISTA, TipoDeUbicacionAsiento.PASILLO, false, "10/10/2012 09:00", "11/10/2012 10:00" , "ESP", "USA"));
		this.asientos.add(new AsientoLanchita("002-9", (float) 5000, TipoDeClaseAsiento.EJECUTIVA, TipoDeUbicacionAsiento.VENTANA, false, "10/10/2012 09:00", "11/10/2012 10:00" , "ESP", "USA"));
		this.asientos.add(new AsientoLanchita("002-10", (float) 5000, TipoDeClaseAsiento.EJECUTIVA, TipoDeUbicacionAsiento.PASILLO, false, "10/10/2012 09:00", "11/10/2012 10:00" , "ESP", "USA"));
		this.asientos.add(new AsientoLanchita("002-11", (float) 6000, TipoDeClaseAsiento.PRIMERACLASE, TipoDeUbicacionAsiento.VENTANA, true, "10/10/2012 09:00", "10/10/2012 10:00" , "ESP", "USA"));
		this.asientos.add(new AsientoLanchita("002-12", (float) 6000, TipoDeClaseAsiento.PRIMERACLASE, TipoDeUbicacionAsiento.CENTRO, true, "10/10/2012 09:00", "10/10/2012 10:00" , "ESP", "USA"));
	}


	@Test
	public void testFiltroBasico() {	
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(this.asientos.get(0));
		asientos_esperados.add(this.asientos.get(1));
		asientos_esperados.add(this.asientos.get(2));

		FiltroObligatorio filtroObligatorio = new FiltroObligatorio("EZE","USA","10/10/2012",this.cliente);
		Iterable<Asiento> asientos_filtrados = filtroObligatorio.filtrar(this.asientos);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos_filtrados));
	}
	@Test
	public void testFiltroPorPrecio() {	
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(this.asientos.get(0));
		asientos_esperados.add(this.asientos.get(1));

		

		FiltroObligatorio filtroObligatorio = new FiltroObligatorio("EZE","USA","10/10/2012",this.cliente);
		FiltroOpcional filtroPorPrecio = new FiltroPorPrecio(filtroObligatorio,this.cliente, (float)100, (float)1500);
		Iterable<Asiento> asientos_filtrados = filtroPorPrecio.filtrar(this.asientos);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos_filtrados));
	}
	@Test
	public void testPorUbicacion() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(this.asientos.get(5));
		asientos_esperados.add(this.asientos.get(6));
		asientos_esperados.add(this.asientos.get(7));
		asientos_esperados.add(this.asientos.get(9));
		

		FiltroObligatorio filtroObligatorio = new FiltroObligatorio("ESP","USA","10/10/2012",this.cliente);
		FiltroOpcional filtroPorUbicacion = new FiltroPorUbicacion(filtroObligatorio,TipoDeUbicacionAsiento.PASILLO);
		Iterable<Asiento> asientos_filtrados = filtroPorUbicacion.filtrar(this.asientos);
		
		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos_filtrados));
	}
	@Test
	public void testPorClase() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(this.asientos.get(8));
		asientos_esperados.add(this.asientos.get(9));
		

		FiltroObligatorio filtro = new FiltroObligatorio("ESP","USA","10/10/2012",this.cliente);
		FiltroPorClase filtroPorClase = new FiltroPorClase(filtro);
		filtroPorClase.addClase(TipoDeClaseAsiento.EJECUTIVA);
		Iterable<Asiento> asientos_filtrados = filtroPorClase.filtrar(this.asientos);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos_filtrados));
	}
	@Test
	public void testPorClase2() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(this.asientos.get(8));
		asientos_esperados.add(this.asientos.get(9));
		

		FiltroObligatorio filtro = new FiltroObligatorio("ESP","USA","10/10/2012",this.cliente);
		FiltroPorClase filtroPorClase = new FiltroPorClase(filtro,TipoDeClaseAsiento.EJECUTIVA);
		Iterable<Asiento> asientos_filtrados = filtroPorClase.filtrar(this.asientos);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos_filtrados));
	}
	@Test
	public void testPorClaseMultiplesClases() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(this.asientos.get(6));
		asientos_esperados.add(this.asientos.get(8));
		asientos_esperados.add(this.asientos.get(9));
		asientos_esperados.add(this.asientos.get(10));
		asientos_esperados.add(this.asientos.get(11));
		

		FiltroObligatorio filtro = new FiltroObligatorio("ESP","USA","10/10/2012",this.cliente);
		FiltroPorClase filtroPorClase = new FiltroPorClase(filtro,TipoDeClaseAsiento.EJECUTIVA);
		filtroPorClase.addClase(TipoDeClaseAsiento.PRIMERACLASE);
		Iterable<Asiento> asientos_filtrados = filtroPorClase.filtrar(this.asientos);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos_filtrados));
	}
	@Test
	public void testPorClaseMultiplesClases2() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(this.asientos.get(5));
		asientos_esperados.add(this.asientos.get(6));
		asientos_esperados.add(this.asientos.get(7));
		asientos_esperados.add(this.asientos.get(8));
		asientos_esperados.add(this.asientos.get(9));
		asientos_esperados.add(this.asientos.get(10));
		asientos_esperados.add(this.asientos.get(11));
		

		FiltroObligatorio filtro = new FiltroObligatorio("ESP","USA","10/10/2012",this.cliente);
		FiltroPorClase filtroPorClase = new FiltroPorClase(filtro,TipoDeClaseAsiento.EJECUTIVA);
		filtroPorClase.addClase(TipoDeClaseAsiento.PRIMERACLASE);
		filtroPorClase.addClase(TipoDeClaseAsiento.TURISTA);
		Iterable<Asiento> asientos_filtrados = filtroPorClase.filtrar(this.asientos);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos_filtrados));
	}
	@Test
	public void testPorAsientoReservado() {
		List<Asiento> asientos_esperados = new ArrayList<Asiento>();
		asientos_esperados.add(this.asientos.get(5));
		asientos_esperados.add(this.asientos.get(6));
		asientos_esperados.add(this.asientos.get(7));
		asientos_esperados.add(this.asientos.get(8));
		asientos_esperados.add(this.asientos.get(9));
		asientos_esperados.add(this.asientos.get(10));
		asientos_esperados.add(this.asientos.get(11));
		

		FiltroObligatorio filtro = new FiltroObligatorio("ESP","USA","10/10/2012",this.cliente);
		FiltroPorAsientosReservados filtroPorAsientosReservados = new FiltroPorAsientosReservados(filtro);
		Iterable<Asiento> asientos_filtrados = filtroPorAsientosReservados.filtrar(this.asientos);

		assertTrue(Iterables.elementsEqual(asientos_esperados, asientos_filtrados));
	}
}
